package com.example.course.config;

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.context.annotation.Bean;

import javax.sql.DataSource;



// 声明当前类为 Spring 的配置类，用于定义 Bean 的创建逻辑
public class MyBatisPlusConfig {

    /**
     * 创建并配置 SqlSessionFactory Bean，用于构建 MyBatis 的核心会话工厂
     * @param dataSource 自动注入的数据源对象（由 Spring 容器管理）
     * @return SqlSessionFactory 实例
     * @throws Exception 可能抛出异常（如配置文件解析失败等）
     *
     * 注：MyBatis-Plus 推荐使用其扩展的 MybatisSqlSessionFactoryBean 替代原生 SqlSessionFactoryBean，
     * 以支持 MP 特有功能（如自动主键生成、性能分析插件等）[2,8](@ref)
     */
    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        // 创建 SqlSessionFactoryBean 实例（原生 MyBatis 的工厂构建器）
        SqlSessionFactoryBean factory = new SqlSessionFactoryBean();

        // 设置数据源，这是 MyBatis 操作数据库的基础
        factory.setDataSource(dataSource);

        // 此处可添加更多配置，例如：
        // 1. 设置 Mapper XML 文件位置（未配置时默认扫描 classpath*:mapper/**/*.xml）[4,5](@ref)
        // factory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));

        // 2. 配置实体类包别名（简化 XML 中的类型全限定名）[5](@ref)
        // factory.setTypeAliasesPackage("com.example.entity");

        // 3. 加载 MyBatis 全局配置文件（如需要自定义缓存、插件等）[4](@ref)
        // factory.setConfigLocation(new ClassPathResource("mybatis-config.xml"));

        // 获取并返回 SqlSessionFactory 实例
        return factory.getObject();
    }

    /**
     * 创建 SqlSessionTemplate Bean，作为线程安全的 SqlSession 实现
     * @param sqlSessionFactory 由 Spring 自动注入的工厂实例
     * @return SqlSessionTemplate 实例
     *
     * 注：SqlSessionTemplate 是 MyBatis-Spring 整合的核心组件，负责：
     * 1. 管理 SqlSession 的生命周期（自动关闭、提交/回滚事务）
     * 2. 与 Spring 事务管理器集成[8](@ref)
     */
    @Bean
    public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
        // 创建并返回 SqlSessionTemplate，包装传入的 SqlSessionFactory
        return new SqlSessionTemplate(sqlSessionFactory);
    }
    //MyBatis-Plus 的分页功能需通过插件实现
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
}
